package com.baomidou.mybatisplus.advance.injector;

import java.util.List;

/**
 * 通过此类去给wrapper添加参数和执行sql返回结果
 *
 * @author wanglei
 * @since 2022-03-14
 */
public interface ModelExtension<T extends ModelExtension> {

    /**
     * 获取动作
     * @return
     */
    List<FuntionTools.Action> childAction();

    /**
     * 内连接
     * @param target 目标model类
     * @param <TG> 目标model类
     * @return 自动new一个目标model类对象
     */
    default <TG> TG innerJoin(Class<TG> target) {
        return FuntionTools.join(target, childAction(),"join");
    }


    /**
     * 左连接
     * @param target 目标model类
     * @param <TG> 目标model类
     * @return 自动new一个目标model类对象
     */
    default <TG> TG leftJoin(Class<TG> target) {
        return FuntionTools.join(target, childAction(),"leftJoin");
    }

    /**
     * 右连接
     * @param target 目标model类
     * @param <TG> 目标model类
     * @return 自动new一个目标model类对象
     */
    default <TG> TG rightJoin(Class<TG> target) {
        return FuntionTools.join(target, childAction(),"rightJoin");
    }

    /**
     * 内连接
     * @param target 目标model类
     * @param <TG> 目标model类
     * @return 自动new一个目标model类对象
     */
    default <TG> TG end(Class<TG> target) {
        return FuntionTools.end(target, childAction());
    }


    /**
     * select 指定字段
     * @param columns 字段
     * @return 自身
     */
    default T select(String... columns) {
        FuntionTools.addSelect(childAction(),this,columns);
        return (T) this;
    }

}
